<!DOCTYPE html>
<html>

<head>
	<meta charset="utf-8">
	<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
	<meta name="theme-color" content="#33474d">
	<title>失落的乐章</title>
	<link rel="stylesheet" href="/css/style.css" />
	
      <link rel="alternate" href="/atom.xml" title="失落的乐章" type="application/atom+xml">
    
</head>

<body>

	<header class="header">
		<nav class="header__nav">
			
				<a href="/archives" class="header__link">Archive</a>
			
				<a href="/tags" class="header__link">Tags</a>
			
				<a href="/atom.xml" class="header__link">RSS</a>
			
		</nav>
		<h1 class="header__title"><a href="/">失落的乐章</a></h1>
		<h2 class="header__subtitle">技术面前，永远都是学生。</h2>
	</header>

	<main>
		
	<span class="different-posts different-posts_earlier">📖 <a href="/page/5">earlier posts</a> 📖</span>




	<article>
	
		<h1><a href="/2017/10/12/Squid/3. squid反向代理/">squid反向代理</a></h1>
	
	<div class="article__infos">
		<span class="article__date">2017-10-12</span><br />
		
		
			<span class="article__tags">
			  	<a class="article__tag-link" href="/tags/Squid/">Squid</a>
			</span>
		
	</div>

	

	
		<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;反向代理的配置过程和正向代理没有什么太大区别，唯一的区别是配置文件中一个地方需要改动一下，需要把</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@192 ~]<span class="comment"># vim /etc/squid/squid.conf</span></div></pre></td></tr></table></figure>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">http_port 3128</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;改为</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">http_port 80 accel vhost vport</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;然后在增加要代理的后端真实服务器信息：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div></pre></td><td class="code"><pre><div class="line">cache_peer 182.140.167.44 parent 80 0 originserver name=a</div><div class="line">cache_peer 180.97.33.108 parent 80 0 originserver name=b</div><div class="line">cache_peer_domain a www.qq.com</div><div class="line">cache_peer_domain b www.baidu.com</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;因为之前没有配置网站信息，所以用qq.com和 baidu.com 来做例子。其中 cache_peer 为配置后端的服务器 IP 以及端口，name 后边为要配置的域名，这里和后面的 cache_peer_domain 相对应。实际的应用中，ip 大多为内外 ip ，而域名也许会有多个，如果是 squid 要代理一台 web 上的所有域名，那么就要写成这样：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">cache_peer 192.168.10.111 80 0 originserver</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;后面连 cache_peer_domain 也省了。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;反向代理主要用于缓存静态项，因为诸多静态项目尤其是图片、流媒体等比较耗费宽带，如果网络资源本来就慢，再去访问大流量的的图片、流媒体那更慢了，所以如果配置一个 squid 反向代理，让客户直接访问这个 squid ，而这些静态项已经被缓存在了 squid 上，这样就大大加快了访问速度。CDN 的设计原理就是这样的思路。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;因为修改了配置文件，所以需要重启一下 squid ：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div></pre></td><td class="code"><pre><div class="line">[root@192 ~]<span class="comment"># /etc/init.d/squid restart</span></div><div class="line">[root@192 ~]<span class="comment"># curl -xlocalhost:80 http://www.baidu.com/ -I</span></div><div class="line">[root@192 ~]<span class="comment"># curl -xlocalhost:80 http://www.qq.com/ -I</span></div><div class="line">[root@192 ~]<span class="comment"># curl -xlocalhost:80 http://www.sina.com/ -I</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;baidu.com 和 qq.com 都能正常访问，然而 sina.com 访问 503 了，这是因为并没有加 sina.com 的相关配置。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;关于 squid ，还有一些知识点是需要了解的：</p>
<p><figure class="figure"><img src="https://github.com/hcldirgit/image/blob/master/squid%E5%8F%8D%E5%90%91%E4%BB%A3%E7%90%86/01.png?raw=true" alt=""></figure></p>
<ul>
<li>-d：将指定调试等级的信息发送到标准错误设备； </li>
<li>-f：使用指定的配置文件。而不使用默认配置文件；</li>
<li>-k：向squid服务器发送指令；</li>
<li>-s：启用syslog日志；</li>
<li>-z：创建缓存目录；</li>
<li>-C：不捕获致命信号；</li>
<li>-D：不进行DNS参数测试；</li>
<li>-N：以非守护进程模式运行；</li>
<li>-X：强制进入完全调试模式。</li>
</ul>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;上面把 squid 命令所用到的选项全部打印出来了，但最常用的除了 squid -k check 外，还有一个就是 squid -k reconfigure 它们两都可以简写：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">squid -kche</div><div class="line">squid -krec</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;其中第二条命令表示重新加载配置文件，如果更改了配置文件后，不需要重启 squid 服务，直接使用该命令重新加载配置即可。 </p>

	

	

</article>




	<article>
	
		<h1><a href="/2017/10/12/Squid/2. squid正向代理/">squid正向代理</a></h1>
	
	<div class="article__infos">
		<span class="article__date">2017-10-12</span><br />
		
		
			<span class="article__tags">
			  	<a class="article__tag-link" href="/tags/Squid/">Squid</a>
			</span>
		
	</div>

	

	
		<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;centos 系统自带 squid 包：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@192 ~]<span class="comment"># yum install -y squid</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;当然也可以源码包编译安装，<a href="http://www.squid-cache.org/" target="_blank" rel="external">Squid官方网站</a>，以下为 squid 编译参数</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div></pre></td><td class="code"><pre><div class="line">./configure --prefix=/usr/<span class="built_in">local</span>/squid \</div><div class="line">--<span class="built_in">disable</span>-dependency-tracking \</div><div class="line">--<span class="built_in">enable</span>-dlmalloc \</div><div class="line">--<span class="built_in">enable</span>-gnuregex \</div><div class="line">--<span class="built_in">disable</span>-carp \</div><div class="line">--<span class="built_in">enable</span>-async-io=240 \</div><div class="line">--with-pthreads \</div><div class="line">--<span class="built_in">enable</span>-storeio=ufs,aufs,diskd,null \</div><div class="line">--<span class="built_in">disable</span>-wccp \</div><div class="line">--<span class="built_in">disable</span>-wccpv2 \</div><div class="line">--<span class="built_in">enable</span>-kill-parent-hack \</div><div class="line">--<span class="built_in">enable</span>-cachemgr-hostname=localhost \</div><div class="line">--<span class="built_in">enable</span>-default-err-language=Simplify_Chinese \</div><div class="line">--with-build-environment=POSIX_V6_ILP32_OFFBIG \</div><div class="line">--with-maxfd=65535 \</div><div class="line">--with-aio \</div><div class="line">--<span class="built_in">disable</span>-poll \</div><div class="line">--<span class="built_in">enable</span>-epoll \</div><div class="line">--<span class="built_in">enable</span>-linux-netfilter \</div><div class="line">--<span class="built_in">enable</span>-large-cache-files \</div><div class="line">--<span class="built_in">disable</span>-ident-lookups \</div><div class="line">--<span class="built_in">enable</span>-default-hostsfile=/etc/hosts \</div><div class="line">--with-dl \</div><div class="line">--with-large-files \</div><div class="line">--<span class="built_in">enable</span>-removal-policies=heap,lru \</div><div class="line">--<span class="built_in">enable</span>-delay-pools \</div><div class="line">--<span class="built_in">enable</span>-snmp \</div><div class="line">--<span class="built_in">disable</span>-internal-dns</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;使用 centos 自带的 squid 已经满足需求，所以没必要编译安装。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;安装完成后，可以查看 squid 版本：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">[root@192 ~]<span class="comment"># squid -v</span></div><div class="line">Squid Cache: Version 3.1.23</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;同时还可以看到 squid 的编译参数。下面配置 squid，来实现正向代理：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">[root@192 ~]<span class="comment"># rm -f /etc/squid/squid.conf</span></div><div class="line">[root@192 ~]<span class="comment"># vim /etc/squid/squid.conf</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;不实用默认的配置文件，删除以后重新写入以下配置：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div></pre></td><td class="code"><pre><div class="line">http_port 3128</div><div class="line">acl manager proto cache_object</div><div class="line">acl localhost src 127.0.0.1/32 ::1</div><div class="line">acl to_localhost dst 127.0.0.0/8 0.0.0.0/32 ::1</div><div class="line">acl localnet src 10.0.0.0/8     <span class="comment"># RFC1918 possible internal network</span></div><div class="line">acl localnet src 172.16.0.0/12  <span class="comment"># RFC1918 possible internal network</span></div><div class="line">acl localnet src 192.168.0.0/16 <span class="comment"># RFC1918 possible internal network</span></div><div class="line">acl SSL_ports port 443</div><div class="line">acl Safe_ports port 80 8080 <span class="comment"># http</span></div><div class="line">acl Safe_ports port 21 <span class="comment"># ftp</span></div><div class="line">acl Safe_ports port 443 <span class="comment"># https</span></div><div class="line">acl CONNECT method CONNECT</div><div class="line">http_access allow manager localhost</div><div class="line">http_access deny manager</div><div class="line">http_access deny !Safe_ports</div><div class="line">http_access deny CONNECT !SSL_ports</div><div class="line">http_access allow localnet</div><div class="line">http_access allow localhost</div><div class="line">http_access allow all</div><div class="line">cache_dir aufs /data/cache 1024 16 256</div><div class="line">cache_mem 128 MB</div><div class="line">hierarchy_stoplist cgi-bin ?</div><div class="line">coredump_dir /var/spool/squid</div><div class="line">refresh_pattern ^ftp: 1440 20% 10080</div><div class="line">refresh_pattern ^gopher: 1440 0% 1440</div><div class="line">refresh_pattern -i (/cgi-bin/|\?) 0 0% 0</div><div class="line">refresh_pattern \.(jpg|png|gif|mp3|xml) 1440 50% 2880 ignore-reload</div><div class="line">refresh_pattern . 0 20% 4320</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;配置文件中，第一行的 “http_port 3128” 这个指的是，squid 服务启动后将要监听的端口，也可以是 80 。“cache_dir” 这个用来指定本地磁盘上的缓存目录，后边的1024为大小，单位是 M 具体根据磁盘大小决定。“cache_mem”它用来规定缓存占用内存的大小，即把缓存的东西存到内存里，具体也需要根据机器的内存定，如果只跑 squid 服务，那么留给系统 512M 内存外，其他可以都分给 squid。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;配置文件保存后，可以先检测一下是否有语法错误：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">[root@192 ~]<span class="comment"># squid -kcheck</span></div><div class="line">squid: ERROR: No running copy</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;如果提示 </p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">squid: ERROR: No running copy</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;这是 squid 还未启动，不过没有关系，显示成这样说明配置文件没有问题了。在启动前还得初始化缓存目录：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div></pre></td><td class="code"><pre><div class="line">[root@192 ~]<span class="comment"># mkdir /data/cache</span></div><div class="line">[root@192 ~]<span class="comment"># chown -R squid:squid /data/cache</span></div><div class="line">[root@192 ~]<span class="comment"># squid -z</span></div><div class="line">2017/03/30 20:36:42| Creating Swap Directories</div><div class="line">2017/03/30 20:36:42| /data/cache exists</div><div class="line">2017/03/30 20:36:42| Making directories <span class="keyword">in</span> /data/cache/00</div><div class="line">2017/03/30 20:36:42| Making directories <span class="keyword">in</span> /data/cache/01</div><div class="line">2017/03/30 20:36:42| Making directories <span class="keyword">in</span> /data/cache/02</div><div class="line">2017/03/30 20:36:42| Making directories <span class="keyword">in</span> /data/cache/03</div><div class="line">2017/03/30 20:36:42| Making directories <span class="keyword">in</span> /data/cache/04</div><div class="line">2017/03/30 20:36:42| Making directories <span class="keyword">in</span> /data/cache/05</div><div class="line">2017/03/30 20:36:42| Making directories <span class="keyword">in</span> /data/cache/06</div><div class="line">2017/03/30 20:36:42| Making directories <span class="keyword">in</span> /data/cache/07</div><div class="line">2017/03/30 20:36:42| Making directories <span class="keyword">in</span> /data/cache/08</div><div class="line">2017/03/30 20:36:42| Making directories <span class="keyword">in</span> /data/cache/09</div><div class="line">2017/03/30 20:36:42| Making directories <span class="keyword">in</span> /data/cache/0A</div><div class="line">2017/03/30 20:36:42| Making directories <span class="keyword">in</span> /data/cache/0B</div><div class="line">2017/03/30 20:36:42| Making directories <span class="keyword">in</span> /data/cache/0C</div><div class="line">2017/03/30 20:36:42| Making directories <span class="keyword">in</span> /data/cache/0D</div><div class="line">2017/03/30 20:36:42| Making directories <span class="keyword">in</span> /data/cache/0E</div><div class="line">2017/03/30 20:36:42| Making directories <span class="keyword">in</span> /data/cache/0F</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;初始化完成后，就可以启动 squid 了：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">[root@192 ~]<span class="comment"># /etc/init.d/squid start</span></div><div class="line">正在启动 squid：. [确定]</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;查看 squid 是否启动：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@192 ~]<span class="comment"># ps aux | grep squid</span></div></pre></td></tr></table></figure>
<p><figure class="figure"><img src="https://github.com/hcldirgit/image/blob/master/squid%E6%AD%A3%E5%90%91%E4%BB%A3%E7%90%86/01.png?raw=true" alt=""></figure></p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;现在可以在真机上测测看 squid 的正向代理了，需要设置 IE 选项，或者直接用 curl 命令测试：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@192 ~]<span class="comment"># curl -xlocalhost:3128 http://www.baidu.com</span></div></pre></td></tr></table></figure>
<p><figure class="figure"><img src="https://github.com/hcldirgit/image/blob/master/squid%E6%AD%A3%E5%90%91%E4%BB%A3%E7%90%86/02.png?raw=true" alt=""></figure></p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;如果看到这样一大串，说明 squid 正向代理设置 OK 了，另外也可以观察 squid 对图片的缓存</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@192 ~]<span class="comment"># curl -xlocalhost:3128 http://www.aminglinux.com/bbs/static/image/common/logo.png -I</span></div></pre></td></tr></table></figure>
<p><figure class="figure"><img src="https://github.com/hcldirgit/image/blob/master/squid%E6%AD%A3%E5%90%91%E4%BB%A3%E7%90%86/03.png?raw=true" alt=""></figure></p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@192 ~]<span class="comment"># curl -xlocalhost:3128 http://www.aminglinux.com/bbs/static/image/common/logo.png -I</span></div></pre></td></tr></table></figure>
<p><figure class="figure"><img src="https://github.com/hcldirgit/image/blob/master/squid%E6%AD%A3%E5%90%91%E4%BB%A3%E7%90%86/04.png?raw=true" alt=""></figure></p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;连续访问两次论坛的 logo 图片，可以发现前后两次的不同，其中“X-Cache-Lookup: HIT from 192.168.0.73:3128”显示，该请求已经 HIT ，它直接从本地的3128端口获取了数据。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;有时候还有这样的需求，就是想限制某些域名不能通过代理访问，或者说只想代理某几个域名，在 squid.conf 中找到：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">acl CONNECT method CONNECT</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;在其下面添加四行：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div></pre></td><td class="code"><pre><div class="line">acl http proto HTTP</div><div class="line">acl good_domain dstdomain .apelearn.com .aminglinux.com</div><div class="line">http_access allow http good_domain</div><div class="line">http_access deny http !good_domain</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;其中白名单域名为“.apelearn.com .aminglinux.com”，这里的 . 表示万能匹配。前面可以是任何字符，只需要填写白名单域名即可。重启 squid 再来测测：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">[root@192 ~]<span class="comment"># /etc/init.d/squid restart</span></div><div class="line">[root@192 ~]<span class="comment"># curl -xlocalhost:3128 http://www.baidu.com/ -I</span></div></pre></td></tr></table></figure>
<p><figure class="figure"><img src="https://github.com/hcldirgit/image/blob/master/squid%E6%AD%A3%E5%90%91%E4%BB%A3%E7%90%86/05.png?raw=true" alt=""></figure></p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;访问百度已经变为403了，如果要设置黑名单，道理是一样的</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div></pre></td><td class="code"><pre><div class="line">acl http proto HTTP</div><div class="line">acl bad_domain dstdomain .sina.com .souhu.com</div><div class="line">http_access allow http !bad_domain</div><div class="line">http_access deny http bad_domain</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;重启 squid 后，测试：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">[root@192 ~]<span class="comment"># /etc/init.d/squid restart </span></div><div class="line">[root@192 ~]<span class="comment"># curl -xlocalhost:3128 http://www.sina.com/ -I</span></div><div class="line">[root@192 ~]<span class="comment"># curl -xlocalhost:3128 http://www.baidu.com/ -I</span></div></pre></td></tr></table></figure>
<p><figure class="figure"><img src="https://github.com/hcldirgit/image/blob/master/squid%E6%AD%A3%E5%90%91%E4%BB%A3%E7%90%86/06.png?raw=true" alt=""></figure></p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;baidu.com 可以访问，而 sina.com 不可以访问了</p>

	

	

</article>




	<article>
	
		<h1><a href="/2017/10/12/Squid/16. 学习CDN不得不读之-Squid 高级优化指南/">学习CDN不得不读之-Squid 高级优化指南</a></h1>
	
	<div class="article__infos">
		<span class="article__date">2017-10-12</span><br />
		
		
			<span class="article__tags">
			  	<a class="article__tag-link" href="/tags/Squid/">Squid</a>
			</span>
		
	</div>

	

	
		<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;首先要明确一下，squid 能够用来作什么。很多人没有搞明白 squid 的工作原理，只是听说 squid 性能不错可以用来给网站提速，就直接在自己的 website 前面套了一个 squid ，这基本没有任何用处，即使你都是静态页面，后面apache上面没有开 mod_expires，一样缓存不了，squid只能起到一个连接管理的用处。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;一般说来，网站用 squid 加速，目的有二种</p>
<ol>
<li><p>squid 本身具有缓存功能，可以将webserver输出的内容缓存起来，在缓存没有过期之前来的访问，都直接用缓存里面的内容，这样可以有效减少 webserver 机器上面的请求数量。这是 squid 的主要功用。</p>
</li>
<li><p>网络慢的用户会长时间占用 webserver 的 TCP 连接，webserver 对每个连接占用的资源比较大，如果长时间不能释放出来服务其他请求，性能会有比较大的影响。前面放一个 squid, webserver 就可以迅速处理完逻辑以后，把数据快速发送给 squid, 然后去处理别的逻辑，而 squid 每个 TCP 连接占用的资源很少，不用担心占用太多资源。这个用途也叫做连接管理，有一些网络设备也可以做这个事情，价格都很贵。</p>
</li>
</ol>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;下面针对 squid 的两种功用，来讲述如何调整业务逻辑和 squid 参数预操作</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;在搞 squid 之前，不管你用什么编译配置，需要什么特殊选项，都请 –enable-snmp ，并配置好 mrtg 之类，可以图形化的显示 squid 状态，例如 Request Hit Ratio(RHR), Byte Hit Ratio(BHR), 等等，反馈是做一切事情的基础，优化也不例外。</p>
<h2 id="缓存"><a href="#缓存" class="headerlink" title="缓存"></a>缓存</h2><h3 id="A-使用-Expires-header-来控制缓存"><a href="#A-使用-Expires-header-来控制缓存" class="headerlink" title="A.使用 Expires header 来控制缓存"></a>A.使用 Expires header 来控制缓存</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;squid在缓存webserver内容的时候，需要后端webserver输出一些控制信息告诉他页面是不是可以被缓存，以及可以缓存多久。否则 squid 是不会自作主张给你缓存内容的。一个页面到底能不能缓存，只有开发网站的人才知道，因此开发人员有责任在动态页面里面输出 Expires 和 Cache-Control header。简单举一个 php 的例子以说明这两个 header 的值是什么含义，其中$expiretime 的单位是秒。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">header(”Expires: ” . gmt_date_format(time()+<span class="variable">$expiretime</span>));</div><div class="line">header(”Cache-Control: max-age=” . “<span class="variable">$expiretime</span>”);</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;对于静态文件，有两种方式来让 squid 自动给静态文件缓存，一种是使用 apache 的 mod_expires ，可以针对路径或者针对文件类型/扩展名来自动输出 cache 头。详细的请参考 mod_expires 的说明 。另一种是用 squid 的 refresh_pattern 来指定。详细的还是请参考 squid 的配置文件。一般来说，如果后端不是配置很麻烦，建议还是在后端做，前端的配置修改大多数都是违背http协议的，如果出现问题，也比较难排查。</p>
<h3 id="B-根据-squid-访问的模式，进行业务拆分"><a href="#B-根据-squid-访问的模式，进行业务拆分" class="headerlink" title="B.根据 squid 访问的模式，进行业务拆分"></a>B.根据 squid 访问的模式，进行业务拆分</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;进行了 Expires Header 的处理以后，squid 就真正可以起到加速的作用了，你可能也能感觉到，网站的访问速度明显加快。但是不要满足于这点成绩，查看 squid 的 snmp 统计图，通常 hit ratio 并不会太高，有 50% 就了不起了。这就是我们需要进一步优化的，我们的目标是让大部分 squid 都达到 9X% 的命中率。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;为什么 squid 命中这么低呢，这大概有两种原因。大多数的网站都是有一些页面不能够被缓存的，例如登录页面。这些页面请求也从 squid 走，成为分母的一部分，直接就降低了命中率，我们首先可以做的事情是，把这些不能够缓存的页面请求，拆分到单独一个 squid 上面，或者访问量不大的话，干脆把 apache 暴露出来。这样能够缓存的那个 squid 命中率马上上升一截。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;有人可能会说，把不能缓存的页面分拆开去，就光为了让能缓存的那个数字好看，这不是掩耳盗铃么？其实这么做是有意义的，首先就是去掉了不能缓存页面 的干 扰，使得我们进一步优化 squid 的依据更加准确。其次是不可缓存请求和可缓存请求之间的重要性通常是有差距的，分拆了以后，它们之间不容易互相抢占资源，不会因为下载图片的连接太多把 squid 占满，影响更重要的登录请求。第三就是可缓存内容通常是图片等页面元素,　浏览器在 load 它们的时候，对每个站点的并发连接会有控制，如果分开成不同的IP，可以多一些请求同时执行。提高少许显示速度。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;其实观察 sohu, sina 之类的页面，你会发现它们的页面也是分拆的，可以看到页面里面的图片都是指向 images.sohu.com 之类的地址，虽然它们可能和其他页面一样后台都指向同一个 apache。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;这样做完，缓存命中率大概能上升到 70%-80% 了，运气好的时候完全可以上 90%。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;另一种导致 squid 命中低的原因和这个比较类似，同样都是可缓存的内容，有的可能是软件下载站上面的大文件，有的是新闻站点上面的小图片，如果同一个 squid 对这样差别巨大的文件加速的话，会严重干扰 squid 的缓存策略，两者不能兼顾，要不就是大文件占据了 cache ，把小文件都挤出了 cache, 要不就是小文件特别多，大文件无法进入 cache, 导致大文件经常 miss 。这个比不能缓存的页面还要恶心，因此即使在服务器资源有限的情况下，也要优先拆分这两类型访问。一般来说，文件大小分界线定在 1M 左右就可以了，如果是有软件下载这样特别大的文件，可以在 4M – 10M 左右再拆分一次。对于不同访问类型的 squid, 其系统优化参数也会有所不同，这个我们后面还会讲到。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;只要悉心按照访问模式来拆分业务，大部分起缓存作用的 squid 都可以达到很高的命中率，至少都可以到达 9X%。</p>
<h3 id="C-根据不同的需求，调整参数优化缓存"><a href="#C-根据不同的需求，调整参数优化缓存" class="headerlink" title="C.根据不同的需求，调整参数优化缓存"></a>C.根据不同的需求，调整参数优化缓存</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;完成 A 和 B 两步优化以后， squid 的命中率经常可以达到 9x%, 可以说我们已经给 squid 创造了非常优秀的外部环境，下面我们就要从 squid 本身入手，通过调整它的缓存参数和缓存策略，甚至系统的参数，来让 squid 发挥出更好的性能。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;在 B 步骤中，我们把 squid 划分成了三种用途，缓存大文件，缓存小文件，不缓存文件，这其中最后一种用途情况下面 squid 不起到缓存效果，只用来做连接管理，因此我们把它放到后面的连接管理里面叙述，这里只讨论和缓存相关的 squid 参数。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;squid 有内存缓存和磁盘缓存两级缓存, 通常来说, 只要是专门给 squid 用的机器, 内    存缓存都建议开得比较大, 大内存缓存总是有好处的嘛, 但是注意不要使得系统开始吃     swap ,像Linux这样一开始吃 swap 性能就下降比较严重的系统尤其要注意. 这个程度需要自己试验确定.</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;通常 1G 内存的Linux机器用来跑 squid ,内存缓存可以开到 512M.</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;有些libc比较差的平台, 例如比较老的 freebsd 系统, 其 malloc 函数的质量不高,可能会造成比较多的内存碎片,导致 squid 运行一段时间以后分配不出来内存挂掉. 这时候推荐在编译时候使用 dlmalloc package. 即使如此, 仍然要再缩小 squid 的内存缓存,以防不幸发生.</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;磁盘缓存的情况比较复杂, squid 有 ufs, aufs, coss, diskd, null 五种存储后端, 其中 ufs, aufs, diskd 都是在文件系统上面保存很多小文件, coss 是 squid 自己实现了一个简单的文件系统,可以使用一个大文件或者一个磁盘设备来存储. null 则是给不想要磁盘缓存的情况准备的. coss 看起来好像比较拽, 但是以前试验并不足够稳定,因此并不推荐使用. 剩下的三种存储方式,具体选择哪种需要根据操作系统的特性来进行.</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;ufs 是最传统的存储方式, 我们知道, squid 是一个单进程的程序, 它使用 ufs 存储后端时, 直接在进程里面读写文件. 这是一种很简单的方式, 缺点是当读写磁盘被阻塞的时候, squid 不能够处理请求, 会造成服务质量波动比较大. 因此出现了 aufs 和 diskd 两种存储后端, 原理都是 squid 主服务循环不负责读写文件, 而是通过消息队列或者tcp/pipe连接将数据传送给其他的线程(aufs)/进程(diskd), 然后其他线程/进程进行读写. 很显然,这两种存储方式有一定的通信开销, 因此不一定就比 ufs 好, 需要具体问题具体分析</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;前面说到, ufs/aufs/diskd都是在文件系统上面存储很多小文件,因此文件系统本身的特性严重影响了squid缓存的性能,对于 Linux ,强烈推荐用 reiserfs 等适合处理小文件的文件系统, bsd 则至少要打开 softupdate, 以及 dirhash 等一切对很多小文件有好处的选项. 在比较新的系统上面, reiserfs 等文件系统的性能已经足够优越, 通常 ufs 就已经可以应付需要. 对于一些老系统,使用 aufs 或者 diskd 是比较好的选择,如果系统的线程库比较好(如Linux,Solaris),那么使用 aufs, 否则 diskd.</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;也有一些例外情况, 比如多 cpu 的 Linux 2.6 系统, 线程库很优秀, 虽然 ufs 本身已经比较快了,但是 squid 单进程无法利用另外的 cpu , 不如使用 aufs , 让另外的 cpu 也可以起到一些作用, aufs 在编译的时候可以选择使用几个读写线程. 这个个人觉得稍微超过 cpu 个数就可以了.但是并没有实际测试过.</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;磁盘缓存开多大? 这个问题没有固定答案. 需要经过试验来确定, 一般来说开大一些没有太大问题. 只要你的硬盘足够</p>

	

	

</article>




	<article>
	
		<h1><a href="/2017/10/12/Squid/15. Squid的防盗链/">Squid的防盗链</a></h1>
	
	<div class="article__infos">
		<span class="article__date">2017-10-12</span><br />
		
		
			<span class="article__tags">
			  	<a class="article__tag-link" href="/tags/Squid/">Squid</a>
			</span>
		
	</div>

	

	
		<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;有了Varnish防盗链，自然也要有Squid的防盗链。原理都一样，对Referer进行判断，当然网上有所谓的终极解决方案还对cookies进行判断的，这里还是只讨论Referer这种。在Squid里就是在配置文件添加acl控制，在squid.conf中的acl段添加如下配置:</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div></pre></td><td class="code"><pre><div class="line">acl has_referer referer_regex .</div><div class="line">acl allow_referer referer_regex -i baidu\.com</div><div class="line">acl allow_referer referer_regex -i google\.com</div><div class="line">acl allow_referer referer_regex -i yahoo\.cn</div><div class="line">acl allow_referer referer_regex -i google\.cn</div><div class="line"> </div><div class="line">http_access allow !has_referer</div><div class="line">http_access deny !allow_referer</div><div class="line">deny_info http://img1.test.com/images/noposter.jpg allow_referer</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;解释一下，has_referer匹配Referer存在，然后利用!has_referer来匹配没有Referer即直接访问的请求，这部分请求不予做防盗链处理，allow。allow_referer即允许使用源站资源的网站，然后利用!allow_referer来匹配不在允许列表的网站，这些不允许的Referer过来的请求就返回deny_info的内容</p>

	

	

</article>




	<article>
	
		<h1><a href="/2017/10/12/Squid/14. 删除squid缓存/">删除squid缓存</a></h1>
	
	<div class="article__infos">
		<span class="article__date">2017-10-12</span><br />
		
		
			<span class="article__tags">
			  	<a class="article__tag-link" href="/tags/Squid/">Squid</a>
			</span>
		
	</div>

	

	
		<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;如何清除squid 缓存</p>
<ol>
<li>首先在squid 的主配置文件中添加acl 列表，并允许受信任的主机有权限清除缓存  </li>
</ol>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div></pre></td><td class="code"><pre><div class="line">acl managercache src 192.168.1.145 127.0.0.1</div><div class="line">acl Purge method PURGE</div><div class="line">http_access allow managercache Purge</div><div class="line">http_access deny Purge</div></pre></td></tr></table></figure>
<ol>
<li>清除squid 中一条缓存  </li>
</ol>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">/usr/<span class="built_in">local</span>/squid/bi/squidclient -h 192.168.1.145 -p80 -m PURGE http://www.linuxidc.com/404.html</div></pre></td></tr></table></figure>
<ol>
<li>批量清除squid 缓存中的文件</li>
</ol>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;脚本如下   </p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div></pre></td><td class="code"><pre><div class="line"><span class="meta">#!/bin/sh</span></div><div class="line"> squidcache_path=<span class="string">"/usr/local/squid/var/cache/"</span></div><div class="line"> squidclient_path=<span class="string">"/usr/local/squid/bin/squidclient"</span></div><div class="line"> grep -a -r <span class="variable">$1</span> <span class="variable">$squidcache_path</span>/* | strings | grep <span class="string">"http:"</span> | awk -F<span class="string">'http:'</span> <span class="string">'&#123;print "http:"$2;&#125;'</span> &gt; cache_list.txt</div><div class="line"> <span class="keyword">for</span> url <span class="keyword">in</span> `cat cache_list.txt`; <span class="keyword">do</span></div><div class="line">     <span class="variable">$squidclient_path</span> -m PURGE -p80 <span class="variable">$url</span></div><div class="line"> <span class="keyword">done</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;注：</p>
<ul>
<li>squidcache_path 是squid 缓存路径</li>
<li>squidclient_path 是squidclient 命令的 路径</li>
<li>-p  是指定squid 监听的端口</li>
</ul>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;给clearcache.sh 执行权限</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line"><span class="comment">#chmod +x clearcache.sh</span></div></pre></td></tr></table></figure>
<ol>
<li>使用方法</li>
</ol>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;用法：</p>
<ul>
<li>清除所有Flash缓存（扩展名.swf）：      </li>
</ul>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">./clear_squid_cache.sh swf</div></pre></td></tr></table></figure>
<ul>
<li>清除URL中包含sina.com.cn的所有缓存：</li>
</ul>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">./clear_squid_cache.sh sina.com.cn</div></pre></td></tr></table></figure>
<ul>
<li>清除文件名为zhangyan.jpg的所有缓存：</li>
</ul>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">./clear_squid_cache.sh zhangyan.jpg</div></pre></td></tr></table></figure>

	

	

</article>




	<article>
	
		<h1><a href="/2017/10/12/Squid/13. 如何查看squid的缓存命中率/">如何查看squid的缓存命中率</a></h1>
	
	<div class="article__infos">
		<span class="article__date">2017-10-12</span><br />
		
		
			<span class="article__tags">
			  	<a class="article__tag-link" href="/tags/Squid/">Squid</a>
			</span>
		
	</div>

	

	
		<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;使用命令：  </p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">squidclient -h host -p port mgr:info</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;比如：  </p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">squidclient -h 127.0.0.1 -p 80 mgr:info</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;使用这个命令的前提是，在squid.conf 中配置了相关的选项</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">acl manager proto cache_object</div><div class="line">http_access allow manager</div></pre></td></tr></table></figure>

	

	

</article>




	<article>
	
		<h1><a href="/2017/10/12/Squid/12. squid日志详解/">squid日志详解</a></h1>
	
	<div class="article__infos">
		<span class="article__date">2017-10-12</span><br />
		
		
			<span class="article__tags">
			  	<a class="article__tag-link" href="/tags/Squid/">Squid</a>
			</span>
		
	</div>

	

	
		<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;squid的日志很重要。常常要了解的，其中最重要的就是命中率啦，不然反向代理做的用就不大。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div></pre></td><td class="code"><pre><div class="line">cat access.log|gawk ‘&#123;<span class="built_in">print</span> <span class="variable">$4</span>&#125;’|sort|uniq -c|sort -nr</div><div class="line"></div><div class="line">9568 TCP_IMS_HIT/304</div><div class="line">6313 TCP_HIT/200</div><div class="line">2133 TCP_MISS/200</div><div class="line">1568 TCP_MISS/206</div><div class="line">587 TCP_MEM_HIT/200</div><div class="line">531 TCP_MISS/304</div><div class="line">207 TCP_REFRESH_HIT/200</div><div class="line">152 TCP_REFRESH_HIT/304</div><div class="line">86 TCP_NEGATIVE_HIT/404</div><div class="line">69 TCP_MISS/404</div><div class="line">9 TCP_MISS/000</div><div class="line">4 TCP_MISS/503</div><div class="line">1 TCP_REFRESH_MISS/000</div><div class="line">1 TCP_DENIED/400</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;可以使用上面的方法，大约的分析一下命令中比。什么意思就看下面的详解.</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">cat /var/<span class="built_in">log</span>/squid/access.log |grep TCP_MEM_HIT</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;如果看到很多的TCP_MEM_HIT ，这表明该文件是从内存缓存读取的，squid已经起作用了！你再用浏览器打开该文件，应该是快如闪电了。。呵呵，大功告成了！还有其他类型的HIT，如TCP_HIT等等，这些是从磁盘读取的，我觉得加速的意义不大，只不过缓解了apache的压力而已。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>相应于HTTP请求，下列标签可能出现在access.log文件的第四个域。</strong></p>
<ul>
<li><p>TCP_HIT ：Squid发现请求资源的貌似新鲜的拷贝，并将其立即发送到客户端。</p>
</li>
<li><p>TCP_MISS ：Squid没有请求资源的cache拷贝。</p>
</li>
<li><p>TCP_REFERSH_HIT ：Squid发现请求资源的貌似陈旧的拷贝，并发送确认请求到原始服务器。原始服务器返回304（未修改）响应，指示squid的拷贝仍旧是新鲜的。</p>
</li>
<li><p>TCP_REF_FAIL_HIT ：Squid发现请求资源的貌似陈旧的拷贝，并发送确认请求到原始服务器。然而，原始服务器响应失败，或者返回的响应Squid不能理解。在此情形下，squid发送现有cache拷贝（很可能是陈旧的）到客户端。</p>
</li>
<li><p>TCP_REFRESH_MISS ：Squid发现请求资源的貌似陈旧的拷贝，并发送确认请求到原始服务器。原始服务器响应新的内容，指示这个cache拷贝确实是陈旧的。</p>
</li>
<li><p>TCP_CLIENT_REFRESH_MISS ：Squid发现了请求资源的拷贝，但客户端的请求包含了Cache-Control: no-cache指令。Squid转发客户端的请求到原始服务器，强迫cache确认。</p>
</li>
<li><p>TCP_IMS_HIT ：客户端发送确认请求，Squid发现更近来的、貌似新鲜的请求资源的拷贝。Squid发送更新的内容到客户端，而不联系原始服务器。</p>
</li>
<li><p>TCP_SWAPFAIL_MISS ：Squid发现请求资源的有效拷贝，但从磁盘装载它失败。这时squid发送请求到原始服务器，就如同这是个cache丢失一样。</p>
</li>
<li><p>TCP_NEGATIVE_HIT ：在对原始服务器的请求导致HTTP错误时，Squid也会cache这个响应。在短时间内对这些资源的重复请求，导致了否命中。 negative_ttl指令控制这些错误被cache的时间数量。请注意这些错误只在内存cache，不会写往磁盘。下列HTTP状态码可能导致否定 cache（也遵循于其他约束）： 204, 305, 400, 403, 404, 405, 414, 500, 501, 502, 503, 504。</p>
</li>
<li><p>TCP_MEM_HIT ：Squid在内存cache里发现请求资源的有效拷贝，并将其立即发送到客户端。注意这点并非精确的呈现了所有从内存服务的响应。例如，某些cache在内存里，但要求确认的响应，会以TCP_REFRESH_HIT, TCP_REFRESH_MISS等形式记录。</p>
</li>
<li><p>TCP_DENIED ：因为http_access或http_reply_access规则，客户端的请求被拒绝了。注意被http_access拒绝的请求在第9域的值是NONE/-，然而被http_reply_access拒绝的请求，在相应地方有一个有效值。</p>
</li>
<li><p>TCP_OFFLINE_HIT ：当offline_mode激活时，Squid对任何cache响应返回cache命中，而不用考虑它的新鲜程度。</p>
</li>
<li><p>TCP_REDIRECT ：重定向程序告诉Squid产生一个HTTP重定向到新的URI（见11.1节）。正常的，Squid不会记录这些重定向。假如要这样做，必须在编译squid前，手工定义LOG_TCP_REDIRECTS预处理指令。</p>
</li>
<li><p>NONE :无分类的结果用于特定错误，例如无效主机名。</p>
</li>
</ul>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>相应于ICP查询，下列标签可能出现在access.log文件的第四域。</strong></p>
<ul>
<li><p>UDP_HIT :Squid在cache里发现请求资源的貌似新鲜的拷贝。</p>
</li>
<li><p>UDP_MISS ：Squid没有在cache里发现请求资源的貌似新鲜的拷贝。假如同一目标通过HTTP请求，就可能是个cache丢失。请对比UDP_MISS_NOFETCH。</p>
</li>
<li><p>UDP_MISS_NOFETCH ：跟UDP_MISS类似，不同的是这里也指示了Squid不愿去处理相应的HTTP请求。假如使用了-Y命令行选项，Squid在启动并编译其内存索引时，会返回这个标签而不是UDP_MISS。</p>
</li>
<li><p>UDP_DENIED ：因为icp_access规则，ICP查询被拒绝。假如超过95%的到某客户端的ICP响应是UDP_DENIED，并且客户端数据库激活了（见附录A），Squid在1小时内，停止发送任何ICP响应到该客户端。若这点发生，你也可在cache.log里见到一个警告。</p>
</li>
<li><p>UDP_INVALID ：Squid接受到无效查询（例如截断的消息、无效协议版本、URI里的空格等）。Squid发送UDP_INVALID响应到客户端</p>
</li>
</ul>

	

	

</article>




	<article>
	
		<h1><a href="/2017/10/12/Squid/11. squid内核优化 减轻timewait问题/">squid内核优化 减轻timewait问题</a></h1>
	
	<div class="article__infos">
		<span class="article__date">2017-10-12</span><br />
		
		
			<span class="article__tags">
			  	<a class="article__tag-link" href="/tags/Squid/">Squid</a>
			</span>
		
	</div>

	

	
		<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Linux下高并发的Squid服务器，TCP TIME_WAIT套接字数量经常达到两、三万，服务器很容易被拖死。通过修改Linux内核参数，可以减少Squid服务器的TIME_WAIT套接字数量。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">vim /etc/sysctl.conf</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;增加以下几行：引用</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div></pre></td><td class="code"><pre><div class="line">net.ipv4.tcp_fin_timeout = 30</div><div class="line">net.ipv4.tcp_keepalive_time = 1200</div><div class="line">net.ipv4.tcp_syncookies = 1</div><div class="line">net.ipv4.tcp_tw_reuse = 1</div><div class="line">net.ipv4.tcp_tw_recycle = 1</div><div class="line">net.ipv4.ip_local_port_range = 1024 65000</div><div class="line">net.ipv4.tcp_max_syn_backlog = 8192</div><div class="line">net.ipv4.tcp_max_tw_b****ets = 5000</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;说明：</p>
<ul>
<li>net.ipv4.tcp_syncookies = 1 表示开启SYN Cookies。当出现SYN等待队列溢出时，启用cookies来处理，可防范少量SYN攻击，默认为0，表示关闭;</li>
<li>net.ipv4.tcp_tw_reuse = 1 表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接，默认为0，表示关闭;</li>
<li>net.ipv4.tcp_tw_recycle = 1 表示开启TCP连接中TIME-WAIT sockets的快速回收，默认为0，表示关闭。</li>
<li>net.ipv4.tcp_fin_timeout = 30 表示如果套接字由本端要求关闭，这个参数决定了它保持在FIN-WAIT-2状态的时间。</li>
<li>net.ipv4.tcp_keepalive_time = 1200 表示当keepalive起用的时候，TCP发送keepalive消息的频度。缺省是2小时，改为20分钟。</li>
<li>net.ipv4.ip_local_port_range = 1024 65000 表示用于向外连接的端口范围。缺省情况下很小：32768到61000，改为1024到65000。</li>
<li>net.ipv4.tcp_max_syn_backlog = 8192 表示SYN队列的长度，默认为1024，加大队列长度为8192，可以容纳更多等待连接的网络连接数。</li>
<li>net.ipv4.tcp_max_tw_b<em>**</em>ets = 5000表示系统同时保持TIME_WAIT套接字的最大数量，如果超过这个数字，TIME_WAIT套接字将立刻被清除并打印警告信息。默认为180000，改为5000。对于Apache、Nginx等服务器，上几行的参数可以很好地减少TIME_WAIT套接字数量，但是对于Squid，效果却不大。此项参数可以控制TIME_WAIT套接字的最大数量，避免Squid服务器被大量的TIME_WAIT套接字拖死。</li>
</ul>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;执行以下命令使配置生效：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">/sbin/sysctl -p</div></pre></td></tr></table></figure>

	

	

</article>




	<article>
	
		<h1><a href="/2017/10/12/Squid/10. squid故障汇总/">squid故障汇总</a></h1>
	
	<div class="article__infos">
		<span class="article__date">2017-10-12</span><br />
		
		
			<span class="article__tags">
			  	<a class="article__tag-link" href="/tags/Squid/">Squid</a>
			</span>
		
	</div>

	

	
		<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;1、COSS will not function without large file support (off_t is 4 bytes long. Please reconsider recompiling squid with –with-large-files</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Bungled squid_webcache.conf 。。。。。。。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;检查是否在编译squid的时候未加入 –with-large-files 选项，如果是，重新加入此选项再编译一次squid</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;2、使用coss缓存格式的时候，squid不断重建cache</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;可能原因为maxfullbufs值过低，去掉maxfullbufs限制，让其值为无限</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;3、日志中有类似如下的内容：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div></pre></td><td class="code"><pre><div class="line">2007/03/05 14:46:56| Ready to serve requests.</div><div class="line"></div><div class="line">2007/03/05 14:46:59| clientReadRequest: FD 11 (192.168.1.5:34061) Invalid Request</div><div class="line"></div><div class="line"></div><div class="line">Illegal character <span class="keyword">in</span> hostname; underscores are not allowed</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;注释： 无效的字符串，访问地址中不允许下划线。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;解决办法 ：</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;squid 2.5 中，编译的时候加入如下参数</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">--<span class="built_in">enable</span>-underscore</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;允许解析的URL中出现下划线，因为默认squid会认为带下划线的URL地址是非法的，并拒绝访问该地址。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;对于 2.6 版本，编译时没有这个参数，这个参数出现在 squid.conf 的配置文档里，说明是这样的：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">allow_underscore New option to allow _ <span class="keyword">in</span> hostnames, replacing the similar build time configure option <span class="keyword">in</span> 2.5 and earlier.</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;具体的在 squid.conf 中的参数，可以在配置文档里搜索一下 allow_underscore，看一下配置文档的具体注释。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;4、squid的cache.log日志中又类似如下的警告：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">WARNING: 100 swapin MD5 mismatches</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;这个错误是说squid读入一个缓存文件的时候，存储在接口对应的位置的URL不是squid认为应该存储在那里的数据。这可能是swap.state有错误或文件指到了磁盘上错误的块（文件系统有错误）。停止squid应用，删除swap.state然后启动squid，让它通过读取缓存文件来重建缓存记录，如果重建后仍然出现上面的情况，那应该就是文件系统或磁盘有问题了。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;5、日志中出现下面警告：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div></pre></td><td class="code"><pre><div class="line">Jun 28 11:14:38 localhost squid[27178]: squidaio_queue_request: Syncing pending I/O operations.. (blocking)</div><div class="line"></div><div class="line">Jun 28 11:14:59 localhost squid[27178]: squidaio_queue_request: Synced</div><div class="line"></div><div class="line">Jun 28 11:14:59 localhost squid[27178]: storeAufsOpenDone: (2) No such file or directory</div><div class="line"></div><div class="line">Jun 28 11:14:59 localhost squid[27178]:         /data/squid/cache_webcache1/00/6B/00006B29</div><div class="line"></div><div class="line">Jun 28 11:14:59 localhost squid[27178]: storeAufsOpenDone: (2) No such file or directory</div><div class="line"></div><div class="line">Jun 28 11:14:59 localhost squid[27178]:         /data/squid/cache_webcache1/00/DC/0000DC36</div><div class="line"></div><div class="line">Jun 28 11:14:59 localhost squid[27178]: WARNING: 1 swapin MD5 mismatches</div><div class="line"></div><div class="line">Jun 28 11:14:59 localhost squid[27178]: WARNING: Disk space over <span class="built_in">limit</span>: 18925740 KB &gt; 16777216 KB</div><div class="line"></div><div class="line">Jun 28 11:14:59 localhost squid[27178]: storeAufsOpenDone: (2) No such file or directory</div><div class="line"></div><div class="line">Jun 28 11:14:59 localhost squid[27178]:         /data/squid/cache_webcache2/00/92/0000924F</div><div class="line"></div><div class="line">Jun 28 11:14:59 localhost squid[27178]: storeAufsOpenDone: (2) No such file or directory</div><div class="line"></div><div class="line">Jun 28 11:14:59 localhost squid[27178]:         /data/squid/cache_webcache1/03/6F/00036FB6</div><div class="line"></div><div class="line">Jun 28 11:14:59 localhost squid[27178]: squidaio_queue_request: Async request queue growing uncontrollably!</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;解决方法：</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;检查配置文件，cache设置为aufs文件系统格式，将此设置改为ufs，重建cache缓存目录</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;6、运行reconfigure的时候出现squid: ERROR: no running copy</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;原因是找不到pid文件，如果不是使用默认的squid.conf作为squid 的设置文件，在用squid目录下sbin/squid进行重新启动等动作的时候要加上-f的参数制定配置文件，同时检查pid文件是否存在，有时候可能错误地配置了pid文件到不存在的目录，或者将pid文件配置到了应用没有权限写入的目录，导致没有创建pid文件，如果pid文件不存在，可以手工创建该pid，然后获取squid的pid并写人pid文件。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;7、squid在压力大的情况下响应非常慢</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;检查是否文件描述符太小，如果是，调整文件描述符限制，重启squid，检查squid运行的文件描述符，如果为调整后的，则在启动脚本处启动squid的地方加入调整文件描述符的命令，否则除此外还需先调整文件描述符限制然后重新编译安装一次squid</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;8、缓存效率下降，查看日志无报错，netstat -na查看连接有比较多的连接为SYN_RE，且多为同一IP过来的连接</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;优化TCP网络</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div></pre></td><td class="code"><pre><div class="line"><span class="built_in">echo</span> 1 &gt; /proc/sys/net/ipv4/tcp_syncookies</div><div class="line"></div><div class="line"><span class="built_in">echo</span> 1 &gt; /proc/sys/net/ipv4/tcp_synack_retries</div><div class="line"></div><div class="line"><span class="built_in">echo</span> 1 &gt; /proc/sys/net/ipv4/tcp_syn_retries</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;9、缓存效率低，网卡输入输出流量差距很小。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;首先查看系统日志有无squid的报错，如果没有再查看dmesg，看看有无丢包，是否网卡问题，如果没有再查看网关</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;使用squid的时候网关问题关系重大，如果网关没有配置正确，将可能导致用户访问不了。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;10、日志报如下错误：squid: Could not determine fully qualified hostname. Please set ‘visible_hostname’</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;检查/etc/hosts文件、/etc/sysconfig/network文件、和hostname命令结果，看看三者是否对应，如果不对应，需要修改为对应，并且/etc/hosts文件中对应的配置还需要有合法域名格式</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;/etc/sysconfig/network中的hostname是系统启动时候加载的hostname值，如果此值与/etc/hosts文件中的值不对应并且squid中没有设置visible_hostname选项的话，会导致系统重启后squid不能正常启动。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;11、日志大量报如下错误：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">Apr 29 08:28:56 localhost squid[13851]: httpReadReply: Excess data from <span class="string">"HEAD http://192.168.230.1/"</span></div><div class="line"></div><div class="line">Apr 29 08:28:56 localhost squid[13851]: httpReadReply: Excess data from <span class="string">"HEAD http://192.168.230.1/"</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;这表明服务器返回一个超过squid声明的响应对象最大值的返回值。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;它违反了HTTP协议并导致服务器返回被截断。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;12.runcache发现频繁重启后停止服务:</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div></pre></td><td class="code"><pre><div class="line">:./bin/RunCache Running: squid -sY &gt;&gt; /usr/<span class="built_in">local</span>/squid//var/squid.out 2&gt;&amp;1</div><div class="line"></div><div class="line">./bin/RunCache: line 35: 20000 File size <span class="built_in">limit</span> exceededsquid -NsY <span class="variable">$conf</span> &gt;&gt;<span class="variable">$logdir</span>/squid.out 2&gt;&amp;1</div><div class="line"></div><div class="line">./bin/RunCache: line 35: 20177 File size <span class="built_in">limit</span> exceededsquid -NsY <span class="variable">$conf</span> &gt;&gt;<span class="variable">$logdir</span>/squid.out 2&gt;&amp;1</div><div class="line"></div><div class="line">RunCache: EXITING DUE TO REPEATED, FREQUENT FAILURES</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;故障原因: log超过了ext3文件系统最大支持容量2G导致,解决办法:</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;每天轮循一次日志0 0 <em> </em> * /usr/local/squid/sbin/squid -k rotate</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;13.报错信息：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div></pre></td><td class="code"><pre><div class="line">FATAL:  Failed to verify one of the swap directories, Check cache.log</div><div class="line">        <span class="keyword">for</span> details.  Run <span class="string">'squid -z'</span> to create swap directories</div><div class="line">        <span class="keyword">if</span> needed, or <span class="keyword">if</span> running Squid <span class="keyword">for</span> the first time.</div><div class="line">Squid Cache (Version 2.6.STABLE18): Terminated abnormally.</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;未执行squid -z命令需要执行该命令初始化cache目录，假如想观察这个过程 squid -zX</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">Creating Swap Directories</div><div class="line">FATAL: Failed to make swap directory /usr/local/squid/var/cache/00:</div><div class="line">    (13) Permission denied</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;确认/usr/local/squid/var/cache目录的所有组成都可被squid.conf给定的用户ID访问</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">WARNING:squidaio_queue_request: WARNING - Queue congestion</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;IO的队列满了, ,重谝一下源代码,加大IO的队列或换一种IO方式。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;编译时：–enable-async-io=40 （40，少了）</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">helperOpenServers: Starting 5 <span class="string">'dnsserver'</span> processes</div><div class="line">ipcCreate: fork: (12) Cannot allocate memory</div><div class="line">WARNING: Cannot run <span class="string">'/opt/squid/libexec/dnsserver'</span> process.</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;系统内存被耗光，没有内存分配给squid的dns进程</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">FATAL: xcalloc: Unable to allocate 1 blocks of 4108 bytes!</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Squid 开启大内存导致进程内存溢出</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div></pre></td><td class="code"><pre><div class="line">cache.log</div><div class="line">2009/08/27 20:49:55| HTCP Disabled.</div><div class="line">2009/08/27 20:49:55| sendto FD 17: (1) Operation not permitted</div><div class="line">2009/08/27 20:49:55| ipcCreate: CHILD: hello write <span class="built_in">test</span> failed</div><div class="line">????</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;configure时编译了–enable-icmp参数，去掉即可。</p>

	

	

</article>




	<article>
	
		<h1><a href="/2017/10/12/Squid/1. squid服务介绍/">squid服务介绍</a></h1>
	
	<div class="article__infos">
		<span class="article__date">2017-10-12</span><br />
		
		
			<span class="article__tags">
			  	<a class="article__tag-link" href="/tags/Squid/">Squid</a>
			</span>
		
	</div>

	

	
		<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;squid 是比较知名的代理软件，它不仅可以跑在 linux 上还可以跑在 windows 以及 unix 上，它的技术已经非常成熟，目前使用 squid 的用户也是什么广泛的。squid 与 linux 下其他的代理软件如 apache，socks，TIS FWTK 相比，下载安装简单，配置简单灵活，支持缓存和多种协议。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;squid之所以用的很多，是因为它的缓存功能。squid 缓存不仅可以节省宝贵的宽带资源，也可以大大降低服务器的 I/O 。从经济角度考虑，它是很多网站架构中不可或缺的角色 </p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;squid 不仅可以做正向代理，也可以做反向代理。当作为正向代理时，squid 后面是客户端，客户端想上网需经过 squid 。当一个用户（客户端）想要请求一个主页时，它向 squid 发出一个申请，，要 squid 替他请求，谈后 squid 连接用户要请求的网站并请求该主页，接着把该主页传给用户同时保留一个备份，当别的用户请求同样的页面时，squid 把保存的备份立即传给用户，使用户觉得速度相当快。使用正向代理时，客户端需要做一些设置，才能实现，也就是平时在 IE 选项中设置的那个代理。 而反向代理是，squid 后面为某个站点的服务器，客户端请求带站点时，会先把请求发送到 squid  上，然后 squid 去处理用户的请求动作。</p>
<h2 id="一、正向代理（forward-proxy）"><a href="#一、正向代理（forward-proxy）" class="headerlink" title="一、正向代理（forward proxy）"></a>一、正向代理（forward proxy）</h2><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;一般情况下，如果没有特别说明，代理技术默认说的是正向代理技术。关于正向代理的概念如下： 正向代理(forward)是一个位于客户端<code>用户A</code>和原始服务器(origin server)<code>服务器B</code>之间的服务器<code>代理服务器Z</code>，为了从原始服务器取得内容，用户A向代理服务器Z发送一个请求并指定目标(服务器B)，然后代理服务器Z向服务器B转交请求并将获得的内容返回给客户端。客户端必须要进行一些特别的设置才能使用正向代理。</p>
<p><figure class="figure"><img src="https://github.com/hcldirgit/image/blob/master/squid%E6%9C%8D%E5%8A%A1%E4%BB%8B%E7%BB%8D/01.png?raw=true" alt=""></figure></p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>正向代理</strong>就是<strong>代理服务器替代访问方<code>用户A</code>去访问目标服务器<code>服务器B</code></strong></p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;这就是正向代理的意义所在。而为什么要用代理服务器去代替访问方<code>用户A</code>去访问服务器B呢？这就要从代理服务器使用的意义说起。 </p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;使用正向代理服务器作用主要有以下几点：</p>
<h2 id="1、访问本无法访问的服务器B"><a href="#1、访问本无法访问的服务器B" class="headerlink" title="1、访问本无法访问的服务器B"></a>1、访问本无法访问的服务器B</h2><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;我们抛除复杂的网络路由情节来看图，假设图中路由器从左到右命名为R1,R2假设最初用户A要访问服务器B需要经过R1和R2路由器这样一个路由节点，如果路由器R1或者路由器R2发生故障，那么就无法访问服务器B了。但是如果用户A让代理服务器Z去代替自己访问服务器B，由于代理服务器Z没有在路由器R1或R2节点中，而是通过其它的路由节点访问服务器B，那么用户A就可以得到服务器B的数据了。现实中的例子就是“翻墙”。不过自从VPN技术被广泛应用外，“翻墙”不但使用了传统的正向代理技术，有的还使用了VPN技术。    </p>
<p><figure class="figure"><img src="https://github.com/hcldirgit/image/blob/master/squid%E6%9C%8D%E5%8A%A1%E4%BB%8B%E7%BB%8D/02.png?raw=true" alt=""></figure></p>
<h3 id="2、加速访问服务器B"><a href="#2、加速访问服务器B" class="headerlink" title="2、加速访问服务器B"></a>2、加速访问服务器B</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;这种说法目前不像以前那么流行了，主要是带宽流量的飞速发展。早期的正向代理中，很多人使用正向代理就是提速。还是如上图 假设用户A到服务器B，经过R1路由器和R2路由器，而R1到R2路由器的链路是一个低带宽链路。而用户A到代理服务器Z，从代理服务器Z到服务器B都是高带宽链路。那么很显然就可以加速访问服务器B了。</p>
<h3 id="3、Cache作用"><a href="#3、Cache作用" class="headerlink" title="3、Cache作用"></a>3、Cache作用</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Cache（缓存）技术和代理服务技术是紧密联系的（不光是正向代理，反向代理也使用了Cache（缓存）技术。还如上图所示，如果在用户A访问服务器B某数据J之前，已经有人通过代理服务器Z访问过服务器B上得数据J，那么代理服务器Z会把数据J保存一段时间，如果有人正好取该数据J，那么代理服务器Z不再访问服务器B，而把缓存的数据J直接发给用户A。这一技术在Cache中术语就叫Cache命中。如果有更多的像用户A的用户来访问代理服务器Z，那么这些用户都可以直接从代理服务器Z中取得数据J，而不用千里迢迢的去服务器B下载数据了。</p>
<h3 id="4、客户端访问授权"><a href="#4、客户端访问授权" class="headerlink" title="4、客户端访问授权"></a>4、客户端访问授权</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 这方面的内容现今使用的还是比较多的，例如一些公司采用ISA SERVER做为正向代理服务器来授权用户是否有权限访问互联网，挼下图</p>
<p><figure class="figure"><img src="https://github.com/hcldirgit/image/blob/master/squid%E6%9C%8D%E5%8A%A1%E4%BB%8B%E7%BB%8D/03.png?raw=true" alt=""></figure></p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;防火墙作为网关，用来过滤外网对其的访问。假设用户A和用户B都设置了代理服务器，用户A允许访问互联网，而用户B不允许访问互联网（这个在代理服务器Z上做限制）这样用户A因为授权，可以通过代理服务器访问到服务器B，而用户B因为没有被代理服务器Z授权，所以访问服务器B时，数据包会被直接丢弃。</p>
<h3 id="5、隐藏访问者的行踪"><a href="#5、隐藏访问者的行踪" class="headerlink" title="5、隐藏访问者的行踪"></a>5、隐藏访问者的行踪</h3><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;如下图我们可以看出服务器B并不知道访问自己的实际是用户A，因为代理服务器Z代替用户A去直接与服务器B进行交互。如果代理服务器Z被用户A完全控制（或不完全控制），会惯以“肉鸡”术语称呼。 </p>
<p><figure class="figure"><img src="https://github.com/hcldirgit/image/blob/master/squid%E6%9C%8D%E5%8A%A1%E4%BB%8B%E7%BB%8D/04.png?raw=true" alt=""></figure></p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;我们总结一下 正向代理是一个位于客户端和原始服务器(origin server)之间的服务器，为了从原始服务器取得内容，客户端向代理发送一个请求并指定目标(原始服务器)，然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端必须设置正向代理服务器，当然前提是要知道正向代理服务器的IP地址，还有代理程序的端口。   </p>
<p><figure class="figure"><img src="https://github.com/hcldirgit/image/blob/master/squid%E6%9C%8D%E5%8A%A1%E4%BB%8B%E7%BB%8D/05.png?raw=true" alt=""></figure></p>
<h2 id="二、反向代理（reverse-proxy）"><a href="#二、反向代理（reverse-proxy）" class="headerlink" title="二、反向代理（reverse proxy）"></a>二、反向代理（reverse proxy）</h2><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;反向代理正好与正向代理相反，对于客户端而言代理服务器就像是原始服务器，并且客户端不需要进行任何特别的设置。客户端向反向代理的命名空间(name-space)中的内容发送普通请求，接着反向代理将判断向何处(原始服务器)转交请求，并将获得的内容返回给客户端。 使用反向代理服务器的作用如下：</p>
<h3 id="1、保护和隐藏原始资源服务器如下图"><a href="#1、保护和隐藏原始资源服务器如下图" class="headerlink" title="1、保护和隐藏原始资源服务器如下图"></a>1、保护和隐藏原始资源服务器如下图</h3><p><figure class="figure"><img src="https://github.com/hcldirgit/image/blob/master/squid%E6%9C%8D%E5%8A%A1%E4%BB%8B%E7%BB%8D/06.png?raw=true" alt=""></figure></p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;用户A始终认为它访问的是原始服务器B而不是代理服务器Z，但实用际上反向代理服务器接受用户A的应答，从原始资源服务器B中取得用户A的需求资源，然后发送给用户A。由于防火墙的作用，只允许代理服务器Z访问原始资源服务器B。尽管在这个虚拟的环境下，防火墙和反向代理的共同作用保护了原始资源服务器B，但用户A并不知情。</p>
<h3 id="2、负载均衡如下图"><a href="#2、负载均衡如下图" class="headerlink" title="2、负载均衡如下图"></a>2、负载均衡如下图</h3><p><figure class="figure"><img src="https://github.com/hcldirgit/image/blob/master/squid%E6%9C%8D%E5%8A%A1%E4%BB%8B%E7%BB%8D/07.png?raw=true" alt=""></figure></p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;当反向代理服务器不止一个的时候，我们甚至可以把它们做成集群，当更多的用户访问资源服务器B的时候，让不同的代理服务器Z（x）去应答不同的用户，然后发送不同用户需要的资源。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;当然反向代理服务器像正向代理服务器一样拥有CACHE的作用，它可以缓存原始资源服务器B的资源，而不是每次都要向原始资源服务器B请求数据，特别是一些静态的数据，比如图片和文件，如果这些反向代理服务器能够做到和用户X来自同一个网络，那么用户X访问反向代理服务器X，就会得到很高质量的速度。这正是CDN技术的核心。如下图</p>
<p><figure class="figure"><img src="https://github.com/hcldirgit/image/blob/master/squid%E6%9C%8D%E5%8A%A1%E4%BB%8B%E7%BB%8D/08.png?raw=true" alt=""></figure></p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;我们并不是讲解CDN，所以去掉了CDN最关键的核心技术智能DNS。只是展示CDN技术实际上利用的正是反向代理原理这块。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;反向代理结论与正向代理正好相反，对于客户端而言它就像是原始服务器，并且客户端不需要进行任何特别的设置。客户端向反向代理的命名空间(name-space)中的内容发送普通请求，接着反向代理将判断向何处(原始服务器)转交请求，并将获得的内容返回给客户端，就像这些内容原本就是它自己的一样。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;基本上，网上做正反向代理的程序很多，能做正向代理的软件大部分也可以做反向代理。开源软件中最流行的就是squid，既可以做正向代理，也有很多人用来做反向代理的前端服务器。另外MS ISA也可以用来在WINDOWS平台下做正向代理。反向代理中最主要的实践就是WEB服务，近些年来最火的就是Nginx了。网上有人说NGINX不能做正向代理，其实是不对的。NGINX也可以做正向代理，不过用的人比较少了。</p>
<h2 id="三、透明代理"><a href="#三、透明代理" class="headerlink" title="三、透明代理"></a>三、透明代理</h2><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;如果把正向代理、反向代理和透明代理按照人类血缘关系来划分的话。那么正向代理和透明代理是很明显堂亲关系，而正向代理和反向代理就是表亲关系了 。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;透明代理的意思是客户端根本不需要知道有代理服务器的存在，它改编你的request fields（报文），并会传送真实IP。注意，加密的透明代理则是属于匿名代理，意思是不用设置使用代理了。 透明代理实践的例子就是时下很多公司使用的行为管理软件。如下图</p>
<p><figure class="figure"><img src="https://github.com/hcldirgit/image/blob/master/squid%E6%9C%8D%E5%8A%A1%E4%BB%8B%E7%BB%8D/09.png?raw=true" alt=""></figure></p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;用户A和用户B并不知道行为管理设备充当透明代理行为，当用户A或用户B向服务器A或服务器B提交请求的时候，透明代理设备根据自身策略拦截并修改用户A或B的报文，并作为实际的请求方，向服务器A或B发送请求，当接收信息回传，透明代理再根据自身的设置把允许的报文发回至用户A或B，如上图，如果透明代理设置不允许访问服务器B，那么用户A或者用户B就不会得到服务器B的数据。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;关于正向代理、反向代理这两个概念有一个特别容易的区分：正向代理，squid 后面是客户端，客户端上网要通过 squid 去上。反向代理， squid 后面是服务器，服务器返回给用户数据需要走 squid。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;那么，什么时候需要配置正向代理，什么时候需要配置反向代理呢。正向代理用在企业的办公环境中，员工上网需要通过 squid 代理来上，这样可以节省网络带宽资源。而反向代理用来搭建网站静态项（图片、html、流媒体、js、css等）的缓存服务器，它用于网站架构中。</p>

	

	

</article>





	<span class="different-posts">📖 <a href="/page/7">more posts</a> 📖</span>



	</main>

	<footer class="footer">
	<div class="footer-content">
		
	      <div class="footer__element">
	<p>Hi there, <br />welcome to my Blog glad you found it. Have a look around, will you?</p>
</div>

	    
	      <div class="footer__element">
	<h5>Check out</h5>
	<ul class="footer-links">
		<li class="footer-links__link"><a href="/archives">Archive</a></li>
		
		  <li class="footer-links__link"><a href="/atom.xml">RSS</a></li>
	    
		<li class="footer-links__link"><a href="/about">about page</a></li>
		<li class="footer-links__link"><a href="/tags">Tags</a></li>
		<li class="footer-links__link"><a href="/categories">Categories</a></li>
	</ul>
</div>

	    

		<div class="footer-credit">
			<span>© 2017 失落的乐章 | Powered by <a href="https://hexo.io/">Hexo</a> | Theme <a href="https://github.com/HoverBaum/meilidu-hexo">MeiliDu</a></span>
		</div>

	</div>


</footer>



</body>

</html>
